package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.CapacitacionDAOLocal;
import pe.gob.osce.sirenas.dao.convert.CapacitacionConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.CapacitacionDTO;
import pe.gob.osce.sirenas.model.jpa.Capacitacion;
import pe.gob.osce.sirenas.model.jpa.FormacionAcademica;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialCapacitacion;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class CapacitacionDAOImpl implements CapacitacionDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	@Override
	public Capacitacion insertar(Capacitacion  capacitacion ) throws Exception {
		capacitacion=em.merge(capacitacion);
		em.flush();
		return capacitacion;
	}

	@Override
	public Boolean insertarHistorialCapacitacion(HistorialCapacitacion historialCapacitacion ) throws Exception {
		boolean confirmacion= false;
		try {
			historialCapacitacion=em.merge(historialCapacitacion);
			em.flush();
			confirmacion=true;
		} catch (Exception e) {
			confirmacion=false;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		
		return confirmacion;
	}
	
	@Override 
	public Capacitacion obtenerCapacitacion(Long idCapacitacion)
			throws Exception {
		Capacitacion		capacitacionJPA=null;
		List<Capacitacion>		listCapacitacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT cap FROM Capacitacion cap WHERE cap.idCapacitacion = :idCapacitacion");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idCapacitacion", idCapacitacion);
			
			List<Capacitacion> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listCapacitacionJPA=new ArrayList<Capacitacion>();
				for (Capacitacion obj: listaObjeto) {					
					capacitacionJPA=(obj);
				}				
			}
		} catch (NoResultException nre) {
			capacitacionJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return capacitacionJPA;
	}	

	@Override 
	public List<CapacitacionDTO>  obtenerListaCapacitacion(Long idFicha)
			throws Exception {

		List<CapacitacionDTO> listCapacitacionDTO=null;		
		List<Capacitacion> listaCapacitacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();

			jpql.append("SELECT cap FROM Capacitacion cap WHERE  cap.idFicha = :idFicha ORDER BY cap.indEspecialidad, cap.auditoria.fechaRegistro DESC ");
						
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);			
			List<Capacitacion>	listaObjeto= query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listaCapacitacionJPA=new ArrayList<Capacitacion>();
				for (Capacitacion obj: listaObjeto) {					
					listaCapacitacionJPA.add(obj);
				}
				listCapacitacionDTO=CapacitacionConvert.createListCapacitacionDTO(listaCapacitacionJPA);
			}
			
			
		} catch (NoResultException nre) {
			listCapacitacionDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listCapacitacionDTO;
	}
	
	@Override 
	public List<HistorialCapacitacion> consultarHistorialCapacitacion(Long idCapacitacion)
			throws Exception {
		Capacitacion		capacitacionJPA=null;
		List<HistorialCapacitacion>		listHistorialCapacitacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT cap FROM HistorialCapacitacion cap WHERE cap.idCapacitacion = :idCapacitacion");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idCapacitacion", idCapacitacion);
			
			List<HistorialCapacitacion> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listHistorialCapacitacionJPA=new ArrayList<HistorialCapacitacion>();
				for (HistorialCapacitacion obj: listaObjeto) {					
					listHistorialCapacitacionJPA.add(obj);
				}				
			}
		} catch (NoResultException nre) {
			listHistorialCapacitacionJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listHistorialCapacitacionJPA;
	}	
	
}
